02 IIC实验
up的视频讲解通过 IIC 把显示数据送到 OLED,从坐标、字符和像素理解屏幕显示。
up 视频里的实验代码:👣 OLED 实验代码
OLED 驱动文件:OLED 驱动代码
在线工具:OLED 取模工具
1 📱 OLED实验
1.1 实验连接
OLED 的 SCL 接 PB6,SDA 接 PB7,电源与地按图连接。

1.2 实验原理
课程 OLED 的显示区域为 128 × 64 像素。横坐标 x 为 0~127,纵坐标 y 为 0~63;绘图函数根据坐标决定哪些像素显示。

本节先完成字符串显示,后两节再进行汉字与图像取模操作。
阅读下面的代码时,可以沿着“初始化 → 准备画面 → 刷新”三个动作查看屏幕变化。
1.3 CubeMX 配置
先完成课程通用的时钟和下载接口配置,再选择 I2C1 的 I2C 模式,使用标准模式 100 kHz。本实验中 STM32 是主设备,OLED 是从设备。

把驱动加入工程,分为文件、包含路径和工程分组三步:
- 解压本页 OLED 驱动,把文件夹放到工程目录中。
- 在 MDK 的 C/C++ 设置中,把 OLED 文件夹加入
Include Paths。 - 在工程中建立用户分组,把驱动源文件加入该分组。
之后在用户代码中包含 oled.h,调用下方程序。复制文件和添加包含路径都不能代替“把源文件加入工程”这一步。
汉字取模与数组复制操作见第 2 节,图像与手绘取模操作见第 3 节。
先完成全部绘制,最后调用 OLED_Refresh(),屏幕才会显示本次准备好的内容。
1.4 实验代码
全局
#include "oled.h"
main()
OLED_Init();
OLED_ShowString(0,40,"Hello World",16);
OLED_Refresh();
while(1)
2 🪧 取模工具使用:显示汉字
2.1 取模操作
第 1 步:打开在线取模工具。

第 2 步:编辑文字,并复制生成的数组。

第 3 步:将数组粘贴到 main.c。

2.2 实验代码
全局
#define GUOPIE_DATA_SIZE 15
const uint8_t guopie_data[][30] = {
/* 0 果 */ {0x00,0x00,0x00,0xfe,0x4a,0x4a,0x4a,0xfe,0x4a,0x4a,0x4a,0x7e,0x82,0x00,0x00,0x00,0x21,0x11,0x09,0x09,0x04,0x01,0x3f,0x02,0x05,0x09,0x11,0x31,0x11,0x00,},
/* 1 派 */ {0x10,0x10,0x62,0x86,0x3c,0x08,0xfc,0x14,0xf4,0x14,0xd2,0x92,0x4a,0x60,0x00,0x00,0x02,0x1e,0x21,0x10,0x0c,0x03,0x10,0x3f,0x10,0x0b,0x04,0x18,0x10,0x10,},
};
main()
OLED_Init();
OLED_ShowChinese(0, 18, font_data, font_size, 0); /* 0 果 */
OLED_ShowChinese(40, 18, font_data, font_size, 1); /* 1 派 */
OLED_Refresh();
while(1)
3 ✍️ 取模工具使用:显示图像与手绘
3.1 取模操作

3.2 实验代码
全局
#define GUOPIE_DATA_WIDTH 64
#define GUOPIE_DATA_HEIGHT 32
static const unsigned char guopie_data[256] = {
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xC0, 0xC0,
0xC0, 0xC0, 0xC0, 0x80, 0x80, 0x00, 0x00, 0x00, 0x00, 0x60, 0x60, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0xF0, 0xF0, 0x38, 0x1E, 0x0E, 0x06, 0x06, 0x00,
0x80, 0x80, 0x80, 0x00, 0x00, 0xF0, 0xF0, 0x00, 0x00, 0x00, 0x00, 0xFC,
0xFC, 0xF0, 0xF8, 0x3E, 0x07, 0x07, 0xC7, 0xFE, 0x7E, 0x00, 0x00, 0x00,
0x00, 0x00, 0xFE, 0xFE, 0x80, 0x80, 0xC1, 0xF1, 0x7F, 0x1F, 0x00, 0xC0,
0xFC, 0xFC, 0x00, 0x00, 0xF0, 0xFC, 0x3E, 0x36, 0x37, 0x3B, 0x1B, 0x1F,
0x8E, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x7F, 0xF0, 0xE0,
0xC3, 0xC3, 0xC3, 0xFB, 0x7F, 0x3F, 0xFF, 0xE0, 0x00, 0x03, 0x1F, 0x1E,
0x18, 0x1C, 0x1E, 0x07, 0x03, 0x01, 0x03, 0x07, 0x06, 0x06, 0x07, 0x03,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0x03, 0x01, 0x01, 0x00,
0x00, 0x00, 0x00, 0x03, 0x03, 0x00, 0x00, 0x00, 0x01, 0x03, 0x07, 0x06,
0x06, 0x06, 0x07, 0x03, 0x03, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x01, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x03,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00
};
main()
OLED_Init();
OLED_ShowMap(0,0,dinosaur0,DINOSAUR0_WIDTH,DINOSAUR0_HEIGHT);
OLED_Refresh();
while(1)
3.3 实验效果
